home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / jurjen.fft < prev    next >
Internet Message Format  |  1995-03-23  |  4KB

  1. From en.ecn.purdue.edu!noose.ecn.purdue.edu!samsung!sdd.hp.com!spool.mu.edu!uunet!mcsun!hp4nl!charon!jurjen 18 Feb 91 10:28:30 GMT
  2. Path: en.ecn.purdue.edu!noose.ecn.purdue.edu!samsung!sdd.hp.com!spool.mu.edu!uunet!mcsun!hp4nl!charon!jurjen
  3. From: jurjen@cwi.nl (Jurjen NE Bos)
  4. Newsgroups: comp.sys.handhelds
  5. Subject: HP28/48: Very FFT
  6. Keywords: FFT
  7. Message-ID: <2956@charon.cwi.nl>
  8. Date: 18 Feb 91 10:28:30 GMT
  9. Sender: news@cwi.nl
  10. Organization: STORC, Veldhoven
  11. Lines: 83
  12. Originator: jurjen@lijster.cwi.nl
  13.  
  14. A few friends asked me to write an FFT (fast fourier transform; converts a
  15. vector to its "frequency diagram") program.  Looking through my archives,
  16. I could not find any, although I vaguely remember another program was posted.
  17. This program is written with speed in mind.  Most computations are done with
  18. vectors instead of numbers.
  19. At the end of the posting you see a HP48 directory.  HP28 users must know the
  20. following:
  21. The format is DIR <name> <value> <name> <value> ... END.
  22. It is sent in translate code 3; that means that \.. codes are to be
  23. translated:
  24. \<< open program;        \>> close program;
  25. \|v down arrow (make it a 'd')    \Gr greek rho (make it an 'R')
  26. \GS greek Sigma (don't type in the routine DFT)
  27. @ signifies comment.  Don't type in from here to end of line
  28.  
  29. A very nice feature of this program is that it works for ANY vector length.
  30. If the vector length is odd, it is only slightly faster than the regular DFT
  31. program in the end of the directory.  If the length is even, it is slightly
  32. faster, and the more factor of two, the faster.  If the length is a power of
  33. two, the regular FFT algorithm is applied.
  34. All this is in one algorithm, without discrimination of all cases!
  35.  
  36. %%HP: T(3)F(,);
  37. DIR
  38.   CST { { "FFT"
  39.     \<< 1 FFT
  40.     \>> } { "-FFT"
  41.     \<< -1 FFT
  42.     \>> } }
  43.   FFT    @ FFT routine.
  44.     @ Input:    2: Vector 1: 1 for FFT, -1 for inverse
  45.     @ Ouput:    1: transformed vector
  46.     \<< OVER SIZE 1 GET
  47.       IF OVER 0 <    @ Divide by length if inverse FFT
  48.       THEN ROT OVER / ROT ROT
  49.       END (0;6,28318530718) ROT * OVER / SWAP DUP
  50.       WHILE DUP 2 MOD NOT    @ Divide out factors of 2
  51.       REPEAT 2 /
  52.       END SWAP OVER / \-> \Gr r p    @ p: twopower, r: odd rest
  53.                     @ rho: root of unity
  54.       \<< { r p } RDM
  55.         IF r 1 \=/    @ Compute regular r-point FFT p times simultaneously
  56.         THEN A\->L \Gr p * EXP 1 \-> m \Grp \Grn
  57.           \<< 1 r
  58.             START m 1 GET 1 2 r
  59.               FOR k \Grn * m k GET OVER * ROT + SWAP
  60.               NEXT DROP OBJ\-> DROP \Grp '\Grn' STO*
  61.             NEXT
  62.           \>> { r p } \->ARRY
  63.         END TRN CONJ    @ TRN does transpose & conjugate, so conjugate back
  64.         WHILE p 1 \=/    @ combine r-point FFTs to 2r-point FFTs
  65.         REPEAT OBJ\-> DROP 'p' 2 STO/ { p r } \->ARRY TRN A\->L
  66.     @ from here on, we work with conjugated numbers!
  67.       \Gr NEG p * EXP 1 \-> m \Grp \Grn
  68.           \<< { p r } \->ARRY TRN 1 r
  69.             FOR k m k GET \Grn * OBJ\-> DROP \Grp '\Grn' STO*
  70.             NEXT
  71.           \>> { r p } \->ARRY + LASTARG - \-> m
  72.           \<< OBJ\-> DROP m
  73.           \>> OBJ\-> DROP 'r' 2 STO* { r p } \->ARRY TRN
  74.       @ numbers are normal again
  75.         END { r } RDM
  76.       \>>
  77.     \>>
  78.   A\->L    @ convert matrix to list of rows.  This doesn't use sigma+, because
  79.       @ this trick doesn't work with complex numbers :-(
  80.     \<< OBJ\-> OBJ\-> DROP { } \-> r c u
  81.       \<< 1 r
  82.         START c \->ARRY 'u' STO+
  83.         NEXT u
  84.       \>>
  85.     \>>
  86.   DFT    @ The regular Fourier Transform.  Extra short version.
  87.     \<< SWAP DUP SIZE 1 GET (0;6,28318530718) OVER / 4 PICK * \-> d x s q
  88.       \<< 0 s 1 -
  89.         FOR k '\GS(n=0;s-1;x(n+1)*EXP(q*k*n))' \->NUM
  90.         NEXT s \->ARRY
  91.         IF d -1 ==
  92.         THEN s /
  93.         END
  94.       \>>
  95.     \>>
  96. END
  97.  
  98.